/*头文件*/
//------------------------------------
#include "admin.h"

/*文件及文件指针定义*/
//------------------------------------
extern FILE *f_user_info, *f_lottery_info, *f_lottery_man, *f_prize_pool;
extern char* user_info;
extern char* lottery_info;
extern char* lottery_man;
extern char* prize_pool;
//------------------------------------

/*全局变量声明*/
//------------------------------------
extern int  QIHAO, perPrice_lottery, STATE;
//------------------------------------

/* ----------------------------------------------
 * 函数功能：界面
 * 形参：
 * 返回：
 */
void menu(void)
{
	/*界面初始化*/
	system("clear"); 
	printf("欢迎进入管理员程序！\n");
	printf("-----------------------------------------------\n");
	printf("1、发布期号\n");
	printf("2、查看所有用户信息\n");
	printf("3、查看所有彩票信息\n");
	printf("4、查看本期彩票信息\n");
	printf("5、对用户进行排序（按余额排序）\n");
	printf("6、对本期彩票进行排序（按获奖排序）\n");
	printf("7、奖池充值\n");
	printf("0、登出\n");
	printf("11、界面\n");
	printf("99、退出系统\n");
	printf("-----------------------------------------------\n");
}

/* ----------------------------------------------
 * 函数功能：发布期号
 * 形参：
 * 返回：
 */
void issue_version(void)
{
	int pool=0;

	if(!STATE)
	{printf("期号：%d 尚未开奖！不可发布期号！\n",QIHAO);return;}
	
	f_prize_pool=fopen(prize_pool,"r");
	if(!f_prize_pool){perror("");exit(1);}
	fscanf(f_prize_pool,"%d",&pool);
	
	while(1){
		printf("发布彩票单价：");
		if( 1!=scanf("%d",&perPrice_lottery))
		{while(getchar()!='\n');printf(" 格式不正确！\n"); continue;}
		break;
	}
	
	f_lottery_man=fopen(lottery_man,"w");
	if(!f_lottery_man){perror("");exit(1);}
	fprintf(f_lottery_man,"%d %d %d\n",++QIHAO,perPrice_lottery,(STATE=0));
	printf("发布成功！期号为：%d! 单价：%d 开奖奖金池金额：%d\n",QIHAO,perPrice_lottery,pool);
	
	fclose(f_lottery_man),fclose(f_prize_pool);
}

/* ----------------------------------------------
 * 函数功能：奖金池充值
 * 形参：
 * 返回：
 */
void pool_recharge(void)
{
	int pool=0, recharge=0;
	f_prize_pool=fopen(prize_pool,"r");
	if(!f_prize_pool){perror("");exit(1);}
	fscanf(f_prize_pool,"%d",&pool);
	fclose(f_prize_pool);
	
	printf("奖金池现有：%d RMB, 需要充值：",pool);
	scanf("%d",&recharge);
	pool+=recharge;
	
	f_prize_pool=fopen(prize_pool,"w");
	if(!f_prize_pool){perror("");exit(1);}
	fprintf(f_prize_pool, "%d", pool);
	fclose(f_prize_pool);
	
	printf("充值成功！奖金池现有：%d RMB\n",pool);
}

/* ----------------------------------------------
 * 函数功能：载入用户信息
 * 形参：
 * 返回：
 */
void load_users(pNode head)
{
	/*初始化结构体指针*/
	pNode p=head, newnode=NULL;
	pUser users;
	
	/*打开文件*/
	f_user_info=fopen(user_info,"r");
	if(!f_user_info){perror("open file error");exit(1);}
	
	/*读入文件，判断文件读到末尾退出*/
	while(users=(pUser)calloc(1,sizeof(xUser)), \
	fscanf(f_user_info, "%s %s %d", \
	users->name,users->pwd,&users->balance)>0)
	{
		/*创建新节点，存储数据信息*/
		newnode = (pNode)calloc(1,sizeof(xNode));
		if(!newnode){perror("newnode error");exit(1);}
		newnode->data=(pUser)users;
		/*设置前后指针信息，尾部插入*/
		newnode->next=NULL;
		p->next=newnode;
		p=newnode;
	}
	/*关闭文件*/
	free(users);
	fclose(f_user_info);
}

/* ----------------------------------------------
 * 函数功能：载入彩票信息
 * 形参：
 * 返回：
 */
void load_lottery(pNode head, int mode)
{
	/*初始化结构体指针*/
	pNode p=head, newnode=NULL;
	pLottery plotteries;
	
	/*打开文件*/
	f_lottery_info=fopen(lottery_info,"r");
	if(!f_lottery_info){perror("open file error");exit(1);}
	
	/*读入文件，判断文件读到末尾退出*/
	while(plotteries=(pLottery)calloc(1,sizeof(xLottery)), \
	fscanf(f_lottery_info,"%d %s %s %d %d %d %d",\
		&plotteries->id,plotteries->name,\
		plotteries->lottery_num,\
		&plotteries->issue_version,&plotteries->issue_status,\
		&plotteries->prize_status,&plotteries->prize_gain)>0)
	{
		/*mode标志是存入新的期号用户还是所有期号彩票*/
		if(mode && plotteries->issue_version!=QIHAO){free(plotteries);continue;}
		/*创建新节点，存储数据信息*/
		newnode = (pNode)calloc(1,sizeof(xNode));
		if(!newnode){perror("newnode error");exit(1);}
		newnode->data=(pLottery)plotteries;
		/*设置前后指针信息，尾部插入*/
		newnode->next=NULL;
		p->next=newnode;
		p=newnode;
	}
	/*关闭文件*/
	free(plotteries);
	fclose(f_lottery_info);
}

/* ----------------------------------------------
 * 函数功能：输出用户信息
 * 形参：
 * 返回：
 */
void show_users(pNode head)
{
	printf("-----------------------------------------\n");
	if(!head){fprintf(stderr,"head is null");return;}
	printf("用户名\t密码\t余额\n");

	pNode p=head;
	while((p=p->next)){
		printf("%s\t%s\t%d\n",\
		((pUser)(p->data))->name,\
		((pUser)(p->data))->pwd,\
		((pUser)(p->data))->balance);
	}
	printf("-----------------------------------------\n");
	return;
}

/* ----------------------------------------------
 * 函数功能：输出彩票信息
 * 形参：
 * 返回：
 */
void show_lottery(pNode head)
{
	printf("-----------------------------------------\n");
	if(!head){fprintf(stderr,"head is null");return;}
	printf("ID\t帐号\t彩票\t期号\t状态\t得奖\t奖金\n");

	pNode p=head;
	while((p=p->next)){
		printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\n",\
	((pLottery)(p->data))->id,\
	((pLottery)(p->data))->name,\
	((pLottery)(p->data))->lottery_num,\
	((pLottery)(p->data))->issue_version,\
	((pLottery)(p->data))->issue_status,\
	((pLottery)(p->data))->prize_status,\
	((pLottery)(p->data))->prize_gain);
	}
	printf("-----------------------------------------\n");
	return;
}

/* ----------------------------------------------
 * 函数功能：释放列表
 * 形参：
 * 返回：
 */
void free_list(pNode head) 
{
	if(!head){perror("head null!");return;}
	pNode p=NULL, q=NULL;
	/*使用两个指针，一边遍历一边释放空间*/
	p=head->next;
	while(p)
	{
		q=p;               //使用另一个指针保存要释放的节点
		p=p->next;	//遍历的指针指向下一个
		free(q->data);
		free(q);			//将保存了要释放的节点的指针释放
	}
	free(head);head=NULL; //最后再释放头节点
	return;
}

/* ----------------------------------------------
 * 函数功能：释放列表数组
 * 形参：
 * 返回：
 */
void free_list_arr(pNode list_arr[],int len)
{
	while(len--) free_list(list_arr[len]);
}

/* ----------------------------------------------
 * 函数功能：排序
 * 形参：
 * 返回：
 */
void swap(pNode first,pNode third)
{
	pNode sec=first->next;
	pNode four=third->next;
	/*指针域的交换*/
	first->next=third;
	sec->next=four;
	third->next=sec;
}

int compare_balance(pNode user1, pNode user2)
{ 
	int b1=((pUser)(user1->data))->balance;
	int b2=((pUser)(user2->data))->balance;
	
	return b1-b2;
}

int compare_prize_status(pNode lottery1, pNode lottery2)
{
	int lo1= ((pLottery)(lottery1->data))->prize_status;
	int lo2= ((pLottery)(lottery2->data))->prize_status;
	
	return lo1-lo2;
}

void sort(pNode head,int (*comp)(pNode ,pNode ))
{
	if(head->next==NULL)return;
	if(head->next->next==NULL)return;
	/*冒泡排序*/
	for(pNode p=head;p->next;p=p->next)
	for(pNode q=head;q->next->next;q=q->next)
	/*根据输入选择需要排序的成员*/
	if( comp(q->next->next, q->next)>0) 
	swap(q, q->next->next);	
}

